package cn.bo.cloud.common.core.utils.url;

import cn.bo.cloud.common.core.constant.Constants;
import cn.bo.cloud.common.core.utils.StringUtils;
import org.apache.http.Consts;

import java.nio.charset.StandardCharsets;

/**
 * 统一资源定位符相关工具类
 *
 * @author xiaoleilu
 *
 */
public class URLUtil {

	/**
	 * 给http请求url添加参数
	 * @param url
	 * @param params
	 * @return
	 */
	public static String buildGetParam(String url, Object params) {
		if (params != null) {
			//拼接参数
			return org.apache.commons.lang3.StringUtils.join(url,"?", URLEncodedUtilsPerfect.format(params, Consts.UTF_8));
		}
		return url;
	}

	/**
	 * 是否为http(s)://开头
	 *
	 * @param link 链接
	 * @return 结果
	 */
	public static boolean isHttp(String link){
		return StringUtils.startsWithAny(link, Constants.HTTP, Constants.HTTPS);
	}

	/**
	 * 标准化URL字符串，包括：
	 *
	 * <pre>
	 * 1. 多个/替换为一个
	 * </pre>
	 *
	 * @param url URL字符串
	 * @return 标准化后的URL字符串
	 */
	public static String normalize(String url) {
		return normalize(url, false, false);
	}

	/**
	 * 标准化URL字符串，包括：
	 *
	 * <pre>
	 * 1. 多个/替换为一个
	 * </pre>
	 *
	 * @param url URL字符串
	 * @param isEncodeBody 是否对URL中body部分的中文和特殊字符做转义（不包括http:和/）
	 * @param isEncodeParam 是否对URL中参数部分的中文和特殊字符做转义
	 * @return 标准化后的URL字符串
	 * @since 4.4.1
	 */
	public static String normalize(String url, boolean isEncodeBody, boolean isEncodeParam) {
		if (StringUtils.isBlank(url)) {
			return url;
		}
		final int sepIndex = url.indexOf("://");
		String pre;
		String body;
		if (sepIndex > 0) {
			pre = StringUtils.subPre(url, sepIndex + 3);
			body = StringUtils.subSuf(url, sepIndex + 3);
		} else {
			pre = "http://";
			body = url;
		}

		final int paramsSepIndex = StringUtils.indexOf(body, '?');
		String params = null;
		if (paramsSepIndex > 0) {
			params = StringUtils.subSuf(body, paramsSepIndex + 1);
			body = StringUtils.subPre(body, paramsSepIndex);
		}

		// 去除开头的\或者/
		body = body.replaceAll("^[\\\\/]+", StringUtils.EMPTY);
		// 替换多个\或/为单个/
		body = body.replace("\\", "/").replaceAll("//+", "/");
		if (isEncodeBody) {
			body = URLEncoder.DEFAULT.encode(body, StandardCharsets.UTF_8);
			if (params != null) {
				params = "?" + URLEncoder.DEFAULT.encode(params, StandardCharsets.UTF_8);
			}
		}
		return pre + body + StringUtils.nvl(params);
	}
}